import re

from rest_framework import serializers
# 导入模型类
from user.models import User

def address_validate(data):
    # 独立校验器
    # raise serializers.ValidationError('请填写实际地址')  # 有错就抛出异常
    # 没错就返回数据
    return data

class UserSerializer(serializers.ModelSerializer):
    # 重新定义字段，替换掉模型中的设定，重新设定一个最短长度是5,单独指定校验器
    adress = serializers.CharField(max_length=100, min_length=5,validators=[address_validate])

    # 单一字段的验证
    def validate_address(self, data):
        # 如果adress 是测试，就报错
        if data == '测试':
            raise serializers.ValidationError('请填写实际地址')

    # 手机号验证
    def validate_phone(self, data):
        # 验证手机号
        # :param data: 要验证的手机号
        # :return:如果手机号正确返回value，否则抛出异常

        if re.search(r'1[3567]\d{9}$', data):
            return data
        else:
            raise serializers.ValidationError('手机号码不符合规范')

    def validate(self, attrs):
        #所有属性验证器
        # self.context 中有 request和view上下文
        #self.context['view'].action可以取到所有动作
        # attrs 是需要序列化的数据
        # raise serializers.ValidationError('xxx错误')  # 有问题报错
        return attrs  # 没问题返回数据

    class Meta:
        model = User
        # fields = ('id', ) # 临时添加字段也需要写在这里
        fields = '__all__'  # 所有字段
        # exclude = ['id']  # 排除 id 字段
        read_only_fields = ('',)  # 指定字段为 read_only,

        # extra_kwargs = {}  # 局部替换某些字段的设定, 或者新增设定
        extra_kwargs = {
            "address": {
                "min_length": 5,  # 给地址增加 最小长度限制
                "default": '默认测试地址',  # 增加默认值
            }
        }

        #没必要用
        # 统一处理接口文档中的字段描述
        # for field in model._meta.fields:
        #     if extra_kwargs.get(field.attname, None):
        #         extra_kwargs[field.attname]['help_text'] = field.verbose_name
        #     else:
        #         extra_kwargs[field.attname] = {'help_text': field.verbose_name}

class UserUnActiveSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'is_active')  # 临时添加字段也需要写在这里
        # fields = '__all__'  # 所有字段
